#include "MiGame.h"

#include <Box2D/Box2D.h>

//-------------------------------------------------------------//
//-------------	Constructor/Destructor	-----------------------//
//-------------------------------------------------------------//

MiGame::MiGame(): Game(sf::VideoMode(800,600,32), "TP2 - AI - Steering Behaviours - Snack", sf::Style::Titlebar|sf::Style::Close, sf::WindowSettings(24, 8, 0), 60)
{}

MiGame::~MiGame()
{}

//-------------------------------------------------------------//
//-----------------		Metodos		---------------------------//
//-------------------------------------------------------------//

MiGame* MiGame::Singleton()
{
	static MiGame instancia;
	return &instancia;
}

void MiGame::CrearEscena()
{
 m_clock.Reset();
 timer=0;
 conteo=false;

	sf::Image* img = &m_ManagerDeImagenes[IDImagen::VehiculoBurger];
	float escala = 0.2f;

	b2BodyDef cuerpo;
	cuerpo.type        = b2BodyType::b2_dynamicBody;
	b2FixtureDef adorno;
	adorno.restitution = 0.0;
	adorno.isSensor    = false;
	adorno.friction    = 0.3f;
	adorno.density     = 0.01f;//Masa de 26.214399
	b2PolygonShape* pRectangulo = new b2PolygonShape();
	pRectangulo->SetAsBox(img->GetWidth()/2*escala, img->GetHeight()/2*escala, b2Vec2(0,0), 0);
	adorno.shape       = pRectangulo;

	cuerpo.position = b2Vec2(300, 300);
	cuerpo.angle    = 0;

	m_pBurger      = new Vehiculo(cuerpo, adorno, escala, img);//Creamos al vehiculo que deambula
	sf::Image* img2 = &m_ManagerDeImagenes[IDImagen::VehiculoFatBoy];
	cuerpo.position = b2Vec2(100, 100);
	m_pFatBoy = new FatBoy(m_pBurger, cuerpo, adorno, escala, img2);//Creamos al otro vehiculo que lo caza

	m_pBurger->m_FuerzaSteeringMax = 600;
	m_pBurger->m_VelocidadMax = 40;
	m_pFatBoy->m_FuerzaSteeringMax = 600;
	m_pFatBoy->m_VelocidadMax = 40;


	//////////////////////////////////////////////////
	////// ACTIVANDO LOS STEERING BEHAVIORS //////////
	//////////////////////////////////////////////////

		m_pBurger->GetSteeringBehaviors().BuscarOn();
		m_pBurger->GetSteeringBehaviors().m_PesoBuscar = 4.0f;
  //m_pBurger->GetSteeringBehaviors().EscaparOn();
  //m_pBurger->GetSteeringBehaviors().m_PesoEscapar = 4.0f;

		m_pFatBoy->GetSteeringBehaviors().EvadirParedesOn();
		m_pFatBoy->GetSteeringBehaviors().m_PesoEvadirParedes = 2.0f;// El valor por defecto es 1.0f, este escala el resultado
		m_pFatBoy->GetSteeringBehaviors().EvadirObstaculosOn();		 // de la fuerza de EvadirParedes
		m_pFatBoy->GetSteeringBehaviors().m_PesoEvadirObstaculos = 2.0f;// El valor por defecto es 1.0f, este escala el resultado
		m_pFatBoy->GetSteeringBehaviors().DeambularOn();				// de la fuerza de EvadirParedes

  //---------obstaculos y paredes---------//
		// Descripcion de las paredes y asignacion a SteeringBehaviors: Paredes
		// SE VE MUCHO CODIGO PORQUE DEFINIMOS 4 PAREDES, PERO ES REPETITIVO LO QUE HACE

		//Pared de arriba
		cuerpo.type        = b2BodyType::b2_staticBody;
		adorno.restitution = 0.2;
		adorno.isSensor    = false;
		adorno.friction    = 0.3f;
		adorno.density     = 0.01f;
		pRectangulo->SetAsBox(400, 10, b2Vec2(0.0f, 0.0f), 0);
		adorno.shape       = pRectangulo;

		cuerpo.position = b2Vec2(400, 0);
		cuerpo.angle    = 0;
		sf::Shape rectangulo = sf::Shape::Rectangle(sf::Vector2f(-400,  10.0f),
													sf::Vector2f( 400, -10.0f),
													sf::Color::Green);

		Paredes.push_back( new SteeringBehaviors::Pared(sf::Vector2f(0.0f, 1.0f), sf::Vector2f(cuerpo.position.x, cuerpo.position.y)) );
		ParedesEscena.push_back( new EntidadEscena(cuerpo, adorno, &rectangulo) );

		//Pared de abajo
		cuerpo.position = b2Vec2(400, 600);

		Paredes.push_back( new SteeringBehaviors::Pared(sf::Vector2f(0.0f, -1.0f), sf::Vector2f(cuerpo.position.x, cuerpo.position.y)) );
		ParedesEscena.push_back( new EntidadEscena(cuerpo, adorno, &rectangulo) );

		//Pared de izquierda
		cuerpo.position = b2Vec2(0, 300);
		cuerpo.angle = 3.1415f/2.0f;

		Paredes.push_back( new SteeringBehaviors::Pared(sf::Vector2f(1.0f,0.0f), sf::Vector2f(cuerpo.position.x, cuerpo.position.y)) );
		ParedesEscena.push_back( new EntidadEscena(cuerpo, adorno, &rectangulo) );

		//Pared de derecha
		cuerpo.position = b2Vec2(800, 300);
		cuerpo.angle = 3.1415f/2.0f;

		Paredes.push_back( new SteeringBehaviors::Pared(sf::Vector2f(-1.0f,0.0f), sf::Vector2f(cuerpo.position.x, cuerpo.position.y)) );
		ParedesEscena.push_back( new EntidadEscena(cuerpo, adorno, &rectangulo) );

		m_pFatBoy->GetSteeringBehaviors().m_pParedes = &Paredes;

		// Obstaculos
		for(int i=0; i < 8 ; ++i)
		{
			cuerpo.type        = b2BodyType::b2_staticBody;
			adorno.restitution = 0.2;
			adorno.isSensor    = false;
			adorno.friction    = 0.3f;
			adorno.density     = 0.01f;//Masa de 45.32
			b2CircleShape* pCirculo = new b2CircleShape();
			pCirculo->m_radius = 15;
			adorno.shape       = pCirculo;

			cuerpo.position = b2Vec2((rand()/(float)RAND_MAX)*400+200, (rand()/(float)RAND_MAX)*400+100);
			cuerpo.angle    = 0;
			sf::Shape circulo = sf::Shape::Circle(sf::Vector2f(0.0f, 0.0f),
													pCirculo->m_radius, sf::Color::Green);

			Obstaculos.push_back( new EntidadEscena(cuerpo, adorno, &circulo) );
		}
		m_pFatBoy->GetSteeringBehaviors().m_pObstaculos = &Obstaculos;
}

void MiGame::Actualizar()
{
	float dt = Game::m_Window.GetFrameTime();

	const static sf::Input& input = m_Window.GetInput();

	//////////////////////////////////////////////////
	//////     ACTUALIZANDO EL VEHICULO     //////////
	//////////////////////////////////////////////////

 if(input.IsKeyDown(sf::Key::Code::Up))
  m_pBurger->GetSteeringBehaviors().m_PosObjetivo = sf::Vector2f(m_pBurger->GetPosicion().x , m_pBurger->GetPosicion().y - 15);

 if(input.IsKeyDown(sf::Key::Code::Down))
  m_pBurger->GetSteeringBehaviors().m_PosObjetivo = sf::Vector2f(m_pBurger->GetPosicion().x , m_pBurger->GetPosicion().y + 15);

 if(input.IsKeyDown(sf::Key::Code::Right))
  m_pBurger->GetSteeringBehaviors().m_PosObjetivo = sf::Vector2f(m_pBurger->GetPosicion().x + 15, m_pBurger->GetPosicion().y);

 if(input.IsKeyDown(sf::Key::Code::Left))
  m_pBurger->GetSteeringBehaviors().m_PosObjetivo = sf::Vector2f(m_pBurger->GetPosicion().x - 15, m_pBurger->GetPosicion().y);

 if(!input.IsKeyDown(sf::Key::Code::Up) && !input.IsKeyDown(sf::Key::Code::Down) && !input.IsKeyDown(sf::Key::Code::Right) && !input.IsKeyDown(sf::Key::Code::Left))
  m_pBurger->GetSteeringBehaviors().m_PosObjetivo = sf::Vector2f(m_pBurger->GetPosicion().x , m_pBurger->GetPosicion().y);

 if(std::abs(m_pBurger->GetVelocidadLineal().x) <= 0.05 && std::abs(m_pBurger->GetVelocidadLineal().y) <= 0.05)
 {
  m_clock.Reset();
  conteo=true;
  //if(timer==0)
  //{
  // m_clock.Reset();
  // timer+=m_clock.GetElapsedTime();
  //}
  //else
  // timer+=m_clock.GetElapsedTime();



  std::cout<<"conteo hasta 3"<<std::endl;
  std::cout<<"m_pBurger->v.x = "<<m_pBurger->GetVelocidadLineal().x<<"  m_pBurger->v.y = "<<m_pBurger->GetVelocidadLineal().y<<std::endl;
 }
 else
   std::cout<<"m_pBurger->v.x = "<<m_pBurger->GetVelocidadLineal().x<<"  m_pBurger->v.y = "<<m_pBurger->GetVelocidadLineal().y<<std::endl;
 

 m_pBurger->Actualizar(dt);
		//m_pBurger->GetSteeringBehaviors().m_PosObjetivo = sf::Vector2f(input.GetMouseX(), input.GetMouseY());
		m_pFatBoy->Actualizar(dt);

		for(int i=0; i < Obstaculos.size() ; ++i)
			Obstaculos[i]->Actualizar(dt);
	
		for(int i=0; i < ParedesEscena.size() ; ++i)
			ParedesEscena[i]->Actualizar(dt);

	m_World.Step(m_dt, 10, 10);

	m_World.ClearForces();
}

void MiGame::Dibujar()
{
	float dt = Game::m_Window.GetFrameTime();

	m_Window.Clear();

	//////////////////////////////////////////////////
	//////      DIBUJANDO EL VEHICULO       //////////
	//////////////////////////////////////////////////

		m_pBurger->Dibujar(m_Window);
		m_pFatBoy->Dibujar(m_Window);

		for(int i=0; i < Obstaculos.size() ; ++i)
			Obstaculos[i]->Dibujar(m_Window);

		for(int i=0; i < ParedesEscena.size() ; ++i)
			ParedesEscena[i]->Dibujar(m_Window);

	m_Window.Display();
}

void MiGame::LoadRecursos()
{
	if( !m_ManagerDeImagenes[IDImagen::VehiculoFatBoy].LoadFromFile("Recursos\\Vehiculo2.png") )
			exit(0);
	if( !m_ManagerDeImagenes[IDImagen::VehiculoBurger].LoadFromFile("Recursos\\VehiculoCobarde2.png") )
			exit(0);
}